package com.atguigu.hbase;


import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;

import java.io.IOException;

/*
连接hbase的，都是去连接hbase元数据所存储的zk节点
①创建客户端
    Connection:
        a)可以去连服务，包括zk
        b)通过ConnectionFactory创建
        c)谁创建，谁关闭
        d)连接很强大，各种连。连接信息可以被这个Connection中创建的Table,Admin所分享
            Table:表对象。负责对表中的数据进行CRUD
            Admin:管理员。负责执行DDL。对namespace,table执行CRUD
        e)Connection的创建费时费资源，可以在一个App中只创建一次，共享（线程安全）
        f)Table,Admin的创建不费时，不费资源，不是线程安全的，不能共享。
                每个方法都有自己的Table，Admin用完后关掉
②使用客户端发命令
    shell:
        写：put '表名','rowkey','cf:cq','value'
            delete '表名','rowkey'
        读：get '表名','rowkey'
    api:
        Table:代表某一张表

        put : Table.put(Put p)
                Put : 代表对某一行的put操作
        get : Table.get(Get g)
                Get ： 代表对某一行的get操作
        delete ： Table.delete(Delete d)
                Delete : 代表对某一行的delete操作
        scan : Table.getScanner(Scan s)
                Scan : 对某个表的多行查询

        hbase没有数据类型！
           所有的数据，都需要转换为byte[] ,存储！
        读：byte[] -----> 用的类型
        写：用的类型 -----> byte[]

        工具类：
            Bytes : 可以帮我们完成 常用的数据类型 和 byte[]之间的转换
                    Bytes.toBytes(Xxx x):把xxx转为bytes[]
                    Bytes.toXxx(byte[] x):把 bytes [] 还原为 xxx
          CellUtil:Cell :一列的一个版本
                格式：k : rowkey--列族---列名---ts--type
                     v:值
                帮助你获取一个Cell中指定的属性
                byte[] x = CellUtil.cloneXxx(cell c):获取cell中指定的属性，例如rowkey

③用完后关闭
 */
//public class HBaseClient {
//    /*
//    创建一个单例的Connection
//    static :静态。随着类的加载而创建。由于类只加载一次，只创建一次
//     */
//    private static Connection conn;
//    static {
//        try {
//            //默认读取hbase-site.xml文件，把其中的配置自动添加到Configuration中，基于配置创建客户端
//            conn = ConnectionFactory.createConnection();
//        }catch (Exception e){
//            throw new RuntimeException(e);
//        }
//    }
//
//    public static void close() throws IOException {
//        if (conn != null){
//            conn.close();
//        }
//    }
//
//
//    //put '表名','rowkey','cf:cq','value'
//    public static Put createPut(String rk,String cf,String cq,String value){
//        //对当前rk行的put操作
//        Put put = new Put(Bytes.toBytes(rk));
//        //调用一次addColumn，添加一个Cell
//        return put.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cq),Bytes.toBytes(value));
//    }
//
//    /*
//       根据表名，获取代表这张表的table对象
//     */
//    public static Table createTable(String name) throws IOException {
//        if (StringUtils.isBlank(name)){
//            throw new RuntimeException("表名非法！");
//        }
//
//        Table table = conn.getTable(TableName.valueOf(name));
//
//        return table;
//    }
//
//    public static void printResult(Result result){
//        //获取一行中所有的Cell
//        Cell[] cells = result.rawCells();
//
//        for (Cell cell : cells) {
//
//            System.out.println(
//                    "rk:" + Bytes.toString(CellUtil.cloneRow(cell)) +
//                            "," + Bytes.toString(CellUtil.cloneFamily(cell)) + ":" +
//                            Bytes.toString(CellUtil.cloneQualifier(cell)) + ",ts:" +
//                            cell.getTimestamp() + ",type:" + cell.getType() +
//                            ",value:" + Bytes.toString(CellUtil.cloneValue(cell))
//            );
//        }
//    }
//}



public class HBaseClient {
    /*
    创建一个单例的Connection
    static : 静态。随着类的加载而创建。由于类只加载一次，只创建一次
     */
    private static Connection connection;
    static {
        try {
            //默认读取hbase-site.xml文件，把其中的配置自动添加到Configuration中，基于配置创建客户端
            connection = ConnectionFactory.createConnection();
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
    public static void close() throws IOException {
        if (connection != null){
            connection.close();
        }
    }

    //put '表名','rowkey','cf:cq','value'
//    public static Put createPut(String rk,String cf,String value){
//
//    }
}